!-------------------------------------------------------------LICENSE--------------------------------------------------------------!
!                                                                                                                                  !
!The MAP code is written in Fortran language for magnetohydrodynamics (MHD) calculation with the adaptive mesh refinement (AMR)    !
!and Message Passing Interface (MPI) parallelization.                                                                              !
!                                                                                                                                  !
!Copyright (C) 2012                                                                                                                !
!Ronglin Jiang                                                                                                                     !
!rljiang@ssc.net.cn                                                                                                                !
!585 Guoshoujing Road. Pudong, Shanghai, P.R.C. 201203                                                                             !
!                                                                                                                                  !
!This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License         !
!as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.             !
!                                                                                                                                  !
!This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of    !
!MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.                        !
!                                                                                                                                  !
!You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software     !
!Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.                                                   !
!                                                                                                                                  !
!-------------------------------------------------------------LICENSE--------------------------------------------------------------!

!==================================================================================================================================|
subroutine bnd_fixe(ro, mx, my, mz, bx, by, bz, en, gx, gy, gz, po, x, y, z, nx, ny, nz, ng, dir, sides)
!==================================================================================================================================|
!  sides = 'l' for lower boundary
!  sides = 'h' for higher boundary
!  sides = 'b' for both
!----------------------------------------------------------------------------------------------------------------------------------|

   implicit none

   character(1), intent(in) ::  dir, sides
   integer(4), intent(in) :: nx, ny, nz, ng
   real(8), intent(in) :: x(nx), y(ny), z(nz)
   real(8), dimension(nx, ny, nz), intent(inout) :: ro, mx, my, mz, bx, by, bz, en, gx, gy, gz, po

   integer(4) :: i_s, j_s, k_s, i_e, j_e, k_e

!----------------------------------------------------------------------------------------------------------------------------------|
!  initialization
!----------------------------------------------------------------------------------------------------------------------------------|
   if (dir .eq. 'x' .and. sides .eq. 'l') then
      i_s = 1
      i_e = ng
      j_s = 1
      j_e = ny
      k_s = 1
      k_e = nz
   elseif (dir .eq. 'x' .and. sides .eq. 'h') then
      i_s = nx - ng + 1
      i_e = nx
      j_s = 1
      j_e = ny
      k_s = 1
      k_e = nz
   elseif (dir .eq. 'y' .and. sides .eq. 'l') then
      i_s = 1
      i_e = nx
      j_s = 1
      j_e = ng
      k_s = 1
      k_e = nz
   elseif (dir .eq. 'y' .and. sides .eq. 'h') then
      i_s = 1
      i_e = nx
      j_s = ny - ng + 1
      j_e = ny
      k_s = 1
      k_e = nz
   elseif (dir .eq. 'z' .and. sides .eq. 'l') then
      i_s = 1
      i_e = nx
      j_s = 1
      j_e = ny
      k_s = 1
      k_e = ng
   elseif (dir .eq. 'z' .and. sides .eq. 'h') then
      i_s = 1
      i_e = nx
      j_s = 1
      j_e = ny
      k_s = nz - ng + 1
      k_e = nz
   endif

   call model_variables(ro(i_s : i_e, j_s : j_e, k_s : k_e), mx(i_s : i_e, j_s : j_e, k_s : k_e),                                  &
                        my(i_s : i_e, j_s : j_e, k_s : k_e), mz(i_s : i_e, j_s : j_e, k_s : k_e),                                  &
                        bx(i_s : i_e, j_s : j_e, k_s : k_e), by(i_s : i_e, j_s : j_e, k_s : k_e),                                  &
                        bz(i_s : i_e, j_s : j_e, k_s : k_e), en(i_s : i_e, j_s : j_e, k_s : k_e),                                  &
                        gx(i_s : i_e, j_s : j_e, k_s : k_e), gy(i_s : i_e, j_s : j_e, k_s : k_e),                                  &
                        gz(i_s : i_e, j_s : j_e, k_s : k_e), po(i_s : i_e, j_s : j_e, k_s : k_e),                                  &
                        x(i_s : i_e), y(j_s : j_e), z(k_s : k_e), i_e - i_s + 1, j_e - j_s + 1, k_e - k_s + 1)

!----------------------------------------------------------------------------------------------------------------------------------|
   return
end subroutine bnd_fixe
